package com.smart.community.commons.constant;

import com.smart.community.commons.enums.RoleCodeEnum;

/**
 * 角色常量类
 * 统一管理角色相关的字符串常量，避免硬编码
 * 注意：角色代码和名称请优先使用 RoleCodeEnum 枚举类
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
public class RoleConstants {

    // ==================== 角色代码常量（与RoleCodeEnum保持一致） ====================
    /** 超级管理员角色代码 */
    public static final String SUPER_ADMIN = RoleCodeEnum.SUPER_ADMIN.getCode();
    
    /** 系统管理员角色代码 */
    public static final String SYSTEM_ADMIN = RoleCodeEnum.ADMIN.getCode();
    
    /** 普通用户角色代码 */
    public static final String NORMAL_USER = RoleCodeEnum.NORMAL_USER.getCode();
    
    /** 物业管理员角色代码 */
    public static final String PROPERTY_ADMIN = RoleCodeEnum.PROPERTY_ADMIN.getCode();
    
    /** 物业员工角色代码 */
    public static final String PROPERTY_STAFF = RoleCodeEnum.PROPERTY_STAFF.getCode();
    
    /** 安保人员角色代码 */
    public static final String SECURITY_GUARD = RoleCodeEnum.SECURITY_STAFF.getCode();

    // ==================== 角色名称常量（与RoleCodeEnum保持一致） ====================
    /** 超级管理员角色名称 */
    public static final String SUPER_ADMIN_NAME = RoleCodeEnum.SUPER_ADMIN.getDescription();
    
    /** 系统管理员角色名称 */
    public static final String SYSTEM_ADMIN_NAME = RoleCodeEnum.ADMIN.getDescription();
    
    /** 普通用户角色名称 */
    public static final String NORMAL_USER_NAME = RoleCodeEnum.NORMAL_USER.getDescription();
    
    /** 物业管理员角色名称 */
    public static final String PROPERTY_ADMIN_NAME = RoleCodeEnum.PROPERTY_ADMIN.getDescription();
    
    /** 物业员工角色名称 */
    public static final String PROPERTY_STAFF_NAME = RoleCodeEnum.PROPERTY_STAFF.getDescription();
    
    /** 安保人员角色名称 */
    public static final String SECURITY_GUARD_NAME = RoleCodeEnum.SECURITY_STAFF.getDescription();

    // ==================== 权限常量 ====================
    /** 超级管理员权限前缀 */
    public static final String SUPER_ADMIN_PERMISSION_PREFIX = "super:admin:";
    
    /** 系统管理员权限前缀 */
    public static final String SYSTEM_ADMIN_PERMISSION_PREFIX = "system:admin:";
    
    /** 普通用户权限前缀 */
    public static final String NORMAL_USER_PERMISSION_PREFIX = "user:";
    
    /** 物业管理员权限前缀 */
    public static final String PROPERTY_ADMIN_PERMISSION_PREFIX = "property:admin:";
    
    /** 物业员工权限前缀 */
    public static final String PROPERTY_STAFF_PERMISSION_PREFIX = "property:staff:";
    
    /** 安保人员权限前缀 */
    public static final String SECURITY_GUARD_PERMISSION_PREFIX = "security:guard:";

    // ==================== 角色组常量 ====================
    /** 管理员角色组（包含超级管理员和系统管理员） */
    public static final String[] ADMIN_ROLES = {SUPER_ADMIN, SYSTEM_ADMIN};
    
    /** 物业管理角色组（包含物业管理员和物业员工） */
    public static final String[] PROPERTY_MANAGEMENT_ROLES = {PROPERTY_ADMIN, PROPERTY_STAFF};
    
    /** 安防管理角色组（包含安保人员） */
    public static final String[] SECURITY_MANAGEMENT_ROLES = {SECURITY_GUARD};
    
    /** 所有管理角色组 */
    public static final String[] ALL_MANAGEMENT_ROLES = {
        SUPER_ADMIN, SYSTEM_ADMIN, PROPERTY_ADMIN, PROPERTY_STAFF, SECURITY_GUARD
    };

    // ==================== 工具方法（委托给RoleCodeEnum） ====================
    
    /**
     * 检查是否为超级管理员角色
     * 
     * @param roleCode 角色代码
     * @return 是否为超级管理员
     */
    public static boolean isSuperAdminRole(String roleCode) {
        return RoleCodeEnum.isSuperAdmin(roleCode);
    }
    
    /**
     * 检查是否为管理员角色
     * 
     * @param roleCode 角色代码
     * @return 是否为管理员
     */
    public static boolean isAdminRole(String roleCode) {
        return RoleCodeEnum.isAdmin(roleCode);
    }
    
    /**
     * 检查是否为管理角色（包含所有管理类角色）
     * 
     * @param roleCode 角色代码
     * @return 是否为管理角色
     */
    public static boolean isManagementRole(String roleCode) {
        if (roleCode == null) {
            return false;
        }
        return isAdminRole(roleCode) || isPropertyManagementRole(roleCode) || isSecurityManagementRole(roleCode);
    }
    
    /**
     * 检查是否为物业管理角色
     * 
     * @param roleCode 角色代码
     * @return 是否为物业管理角色
     */
    public static boolean isPropertyManagementRole(String roleCode) {
        return RoleCodeEnum.isPropertyRole(roleCode);
    }
    
    /**
     * 检查是否为安防管理角色
     * 
     * @param roleCode 角色代码
     * @return 是否为安防管理角色
     */
    public static boolean isSecurityManagementRole(String roleCode) {
        return SECURITY_GUARD.equals(roleCode);
    }
    
    /**
     * 根据角色代码获取角色枚举
     * 
     * @param roleCode 角色代码
     * @return 角色枚举
     */
    public static RoleCodeEnum getRoleEnum(String roleCode) {
        return RoleCodeEnum.getByCode(roleCode);
    }
    
    /**
     * 根据角色代码获取角色名称
     * 
     * @param roleCode 角色代码
     * @return 角色名称
     */
    public static String getRoleName(String roleCode) {
        RoleCodeEnum roleEnum = RoleCodeEnum.getByCode(roleCode);
        return roleEnum != null ? roleEnum.getDescription() : "未知角色";
    }

    // 私有构造函数，防止实例化
    private RoleConstants() {
        throw new UnsupportedOperationException("工具类不能实例化");
    }
} 